package com.itany.stream;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.function.UnaryOperator;
import java.util.stream.Stream;

/**
 * @Author:石小俊
 * @Date:2022/11/17 14:46
 * @Version:1.0-SNAPSHOT
 * @Description:
 */
public class Test02 {

    private static List<Integer> list = Arrays.asList(2,5,4,9,15,2,12,17,15);
    private static List<String> list2 = Arrays.asList("admin","alice","jack","tom","lily");

    public static void main(String[] args) {
//        filterTest();
//        distinctTest();
//        limitTest();
//        skipTest();
//        findPage(2,3);
//        mapTest();
        sortTest2();
    }

    public static void filterTest(){
        // 过滤数据,保留符合指定规则的数据
        // 其参数是一个断言型函数
        list.stream()
//                .filter(e -> e % 2 == 0)
//                .filter(e -> e > 10)
                .filter(e -> e % 3 == 0)
                .forEach(System.out::println);
    }

    public static void distinctTest(){
        // 去重
        list.stream()
                .distinct()
                .forEach(System.out::println);
    }

    public static void limitTest(){
        // limit(n):截断流,只保留前n个数据
        Stream.iterate(1, i -> i + 1)
                .limit(10)
                .forEach(System.out::println);
    }

    public static void skipTest(){
        // skip(n):跳过元素,返回一个扔掉了前n个数据之后剩下的元素
        list.stream()
                .skip(3)
                .forEach(System.out::println);
    }

    public static void findPage(int pageNo,int pageSize){
        // 可以通过limit与skip实现分页效果
        list.stream()
                .skip((pageNo - 1) * pageSize)
                .limit(pageSize)
                .forEach(System.out::println);
    }

    public static void mapTest(){
        list.stream()
//                .map(i -> i + 1)
                .map(i -> i * i)
                .forEach(System.out::println);
    }

    public static void sortTest(){
        // 排序,默认使用自然顺序进行排序
        list.stream()
                .sorted()
                .distinct()
                .forEach(System.out::println);
        list2.stream()
                .sorted()
                .forEach(System.out::println);
    }

    public static void sortTest2(){
        // 自定义排序,可以对参数传递一个
        // 其参数也是一个函数式接口:Comparator
        // 按照字符串长度进行比较
        // 要求按照长度进行升序排序
        list2.stream()
                // 负数:小于
                // 0:等于
                // 正数:大于
                .sorted(new Comparator<String>() {
                    @Override
                    public int compare(String o1, String o2) {
                        return o1.length() - o2.length();
                    }
                })
                .forEach(System.out::println);
    }

}
